JavaScript数组对象深拷贝

您所在的位置:网站首页 js 复制数组 JavaScript数组对象深拷贝

JavaScript数组对象深拷贝

2023-08-27 09:55| 来源: 网络整理| 查看: 265

文章目录

目录

文章目录

一、为什么要深拷贝?

 二、浅度拷贝

三、深度拷贝

一、为什么要深拷贝?

我们在处理一组对象或者是数组时,往往需要先定义一个新的数组或对象,直接把旧的对象或者数组赋给新的,当然这样就是拷贝吗?其实弊端很大。例如:

var str=['数学成绩','物理成绩','地理成绩']; var newStr=[]; newStr=str; console.log(str); console.log(newStr);

结果为:

 

 你真不会以为这就是你想要的答案,以为以及拷贝成功了,其实并不是。当你想要修改拷贝过后的数组或者对象时?我先帮忙敲一下代码。

var str=['数学成绩','物理成绩','地理成绩']; var newStr=[]; newStr=str; console.log(str); console.log(newStr); newStr[2]='化学成绩'; console.log(str); console.log(newStr);

运行结果:

发现问题了没?修改新的数组过着对象就会把以前旧的数组对象一并修改了,这个是存储器堆栈原理,所以为了避免者一个现象,开始学习如何拷贝对象和数组;

 二、浅度拷贝

所有事物都有一个过度的过程,当然学习也不例外,正题:先自己写个一数组写一个对象,为了方便我们,写个函数封装一下;

var obj = { "a": 1, "b": 2, } var arr = [10, 20, 30]; function deepClone(obj) { //判断是否是数组 var newObj = Array.isArray(obj) ? [] : {} for (var key in obj) { newObj[key] = obj[key]; } return newObj; } var o=deepClone(obj); console.log(o);

这样我们输出的就可以任意修改了,但是问题又来了,如果我们这个是数组加对象的混合数据呢?这样拷贝只能得到其表,不得其心呀。

var obj = { "a": 1, "b": 2, "c": ['hello', 'world'], "stu": { 'name': 'zs', "age": 18, "score": [10, 50, 60] } }

这样的数据是不是既有其表,又有内涵?我们该怎样的到他呢? 

 

三、深度拷贝

深度拷贝的就是在浅度拷贝的基础上加上判断条件,俗称攻心数,什么类型的都给他搞定,下面请看代码:

var str={ name:'lisa', age:18, hobby:'xiangni', 'chengji':{ yuwen:90, Math:150, English:112 } } function deepClone(num){ //判断是不是数组,是数组就用[],是对象就用{}; var newNum=Array.isArray(num)?[]:{} for (var key in num) { //判断下面是object不是 if(typeof(num[key]!='object')){ //不是的话,浅度拷贝 newNum[key]=num[key]; }else{ //如果是object类型,不好意思再走一遍函数把 //这样函数套函数,不管它城府多深,直接摄魂 newNum[key]=deepClone(num[key]); } } return newNum; } mads=deepClone(str); console.log(mads);

 这样我们运行结果

 

 是不是无论这个数据多么有内涵,也能被我们轻松拿下。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3